﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using tea.Models;
using tea.DB;
using Util;
using tea.Controllers;

namespace tea.BL
{
    public class BL이력서
    {
        public const int 경력_교육 = 1;
        public const int 경력_교육외 = 2;

        public static string[] 학력구분목록 = { "학사", "석사", "박사수료", "박사" };
        public static string[] 논문구분목록 = { "국내전문학술지", "국제전문학술지", "국내학술발표", "국제학술발표", "기타" };

        public const int 정렬_회원등록 = 0;
        public const int 정렬_이름 = 1;
        public const int 정렬_생년월일 = 2;

        public static SelectList 이력서정렬순서목록 = new SelectList(
            new List<SelectListItemModel> { 
                new SelectListItemModel(정렬_회원등록, "회원등록"),
                new SelectListItemModel(정렬_이름, "이름"),
                new SelectListItemModel(정렬_생년월일, "생년월일"),
            },
            "ID", "Text"
        );
        
        public const int 검색_없음 = 0;
        public const int 검색_이름 = 1;
        public const int 검색_학위 = 2;
        public const int 검색_경력 = 3;

        public static SelectList 이력서검색유형목록 = new SelectList(
            new List<SelectListItemModel> { 
                new SelectListItemModel(검색_없음, "검색없음"),
                new SelectListItemModel(검색_이름, "이름"),
                new SelectListItemModel(검색_학위, "학위"),
                new SelectListItemModel(검색_경력, "경력"),
            },
            "ID", "Text"
        );

        // 사용자가 이력서를 작성했는지 확인
        public static bool 이력서작성했는가(DBDataContext db, int 사용자ID)
        {
            var 이력서 = db.이력서.FirstOrDefault(p => p.사용자ID == 사용자ID);
            if (이력서 == null) return false;
            if (string.IsNullOrWhiteSpace(이력서.생년월일)) return false;
            if (string.IsNullOrWhiteSpace(이력서.성별)) return false;
            if (이력서.이력서_학력.Count <= 0) return false;
            return true;
        }

        // 이력서 요약 목록 (화면과 보고서)
        public static List<이력서요약Model> 이력서요약목록(int 채용ID)
        {
            using (var db = new DBDataContext()) {
                var list = db.이력서.Where(p => true);
                if (채용ID > 0)
                    list = list.Where(p => db.지원.Any(t => t.사용자ID == p.사용자ID && t.채용ID == 채용ID)); 
                return 이력서요약목록(list);
            }
        }

        public static List<이력서요약Model> 이력서요약목록(IQueryable<DB.이력서> 이력서목록)
        {
           var 결과목록 = new List<이력서요약Model>();
            foreach (var 이력서 in 이력서목록) {
                var 요약 = new 이력서요약Model {
                    사용자ID = 이력서.사용자ID,
                    이름 = 이력서.사용자.이름,
                    생년월일 = 이력서.생년월일,
                    성별 = 이력서.성별,
                    강사전업여부 = 이력서.강사전업여부,
                    연락처 = 이력서.휴대전화 + " " + 이력서.사용자.이메일
                };
                var 학력 = 이력서.이력서_학력.OrderBy(q => q.구분).FirstOrDefault();
                if (학력 != null) 요약.최종학위 = string.Format("{0} {1} {2}", 학력.구분, 학력.학교명.Replace("대학교", "대"), 학력.학과);
                var 경력 = 이력서.이력서_경력.Where(q => q.구분 == BL이력서.경력_교육).OrderByDescending(q => q.기간1).FirstOrDefault();
                if (경력 != null) 요약.최근교육 = string.Format("{0} {1} {2}", (경력.기간1 + "0000").Left(4), 경력.기관.Replace("대학교", "대"), 경력.내용);
                결과목록.Add(요약);
            }
            return 결과목록;
        }

        // 이력서 목록 (보고서용)
        public static List<이력서보고서Model> 이력서보고서목록(string type, int ID)
        {
            using (var db = new DBDataContext()) {
                IQueryable<DB.이력서> 이력서목록 = null;
                if (type == "a" && ID == 0)
                    이력서목록 = db.이력서.Where(p => true);
                if (type == "a" && ID != 0)
                    이력서목록 = db.이력서.Where(p => db.지원.Any(t => t.사용자ID == p.사용자ID && t.채용ID == ID));
                if (type == "p")
                    이력서목록 = db.이력서.Where(p => p.사용자ID == ID);
                return _이력서보고서목록(db, 이력서목록);
            }
        }

        private static List<이력서보고서Model> _이력서보고서목록(DBDataContext db, IQueryable<이력서> 이력서목록)
        {
            var 목록 = 이력서목록.Select(p => new 이력서보고서Model(p)).ToList();
            foreach (var 항목 in 목록) {
                var 사진첨부 = db.파일첨부.FirstOrDefault(q => q.대상유형 == BL파일.파일첨부_이력서사진 && q.대상ID == 항목.사용자ID);
                if (사진첨부 != null) 항목.사진 = 사진첨부.파일.내용.ToArray();

                var 학력목록 = db.이력서_학력.Where(ㅎ => ㅎ.사용자ID == 항목.사용자ID).OrderBy(ㅎ => ㅎ.구분).Take(3);
                int i = 1;
                foreach (var 학력 in 학력목록) {
                    BeanUtil.SetProperties(항목, string.Format("학력{0}_구분", i), 학력.구분);
                    BeanUtil.SetProperties(항목, string.Format("학력{0}_기간", i), 학력.기간1 + " ~ " + 학력.기간2);
                    BeanUtil.SetProperties(항목, string.Format("학력{0}_학교명", i), 학력.학교명);
                    BeanUtil.SetProperties(항목, string.Format("학력{0}_학과", i), 학력.학과);
                    BeanUtil.SetProperties(항목, string.Format("학력{0}_전공", i), 학력.전공);
                    ++i;
                }
                var 경력목록1 = db.이력서_경력.Where(ㅎ => ㅎ.사용자ID == 항목.사용자ID && ㅎ.구분 == BL이력서.경력_교육).OrderByDescending(ㅎ => ㅎ.기간1).Take(3);
                var 경력목록2 = db.이력서_경력.Where(ㅎ => ㅎ.사용자ID == 항목.사용자ID && ㅎ.구분 == BL이력서.경력_교육외).OrderByDescending(ㅎ => ㅎ.기간1).Take(3);
                var 경력목록 = 경력목록1.Union(경력목록2);
                i = 1;
                foreach (var 경력 in 경력목록) {
                    if (i < 4 && 경력.구분 == BL이력서.경력_교육외) i = 4;
                    BeanUtil.SetProperties(항목, string.Format("경력{0}_기간", i), 경력.기간1 + " ~ " + 경력.기간2);
                    BeanUtil.SetProperties(항목, string.Format("경력{0}_기관", i), 경력.기관);
                    BeanUtil.SetProperties(항목, string.Format("경력{0}_직위", i), 경력.직위);
                    BeanUtil.SetProperties(항목, string.Format("경력{0}_내용", i), 경력.내용);
                    ++i;
                }
            }
            return 목록;
        }
    }

    public static class ResumeLinkHekper
    {
        public static string ResumeList(this UrlHelper url, PaginationModel pagination)
        {
            if (url == null) new ResumeController().List(pagination: pagination);
            return url.Action("List", "Resume", pagination);
        }

        public static string ResumeListResize(this UrlHelper url, int id, int size)
        {
            if (url == null) new ResumeController().List(pagination: new PaginationModel());
            return url.Action("List", "Resume", new PaginationModel { ID = id, page = 1, size = size });
        }

        public static string ResumeListSearch(this UrlHelper url, int id, int srchType, string srchText)
        {
            if (url == null) new ResumeController().List(pagination: new PaginationModel());
            return url.Action("List", "Resume", new PaginationModel { ID = id, page = 1, srchType = srchType, srchText = srchText });
        }

        public static string ResumeListSort(this UrlHelper url, int id, int order)
        {
            if (url == null) new ResumeController().List(pagination: new PaginationModel());
            return url.Action("List", "Resume", new PaginationModel { ID = id, page = 1, order = order });
        }
    }
}